
namespace FastFood.Business.Logic
{
	using System;
	using System.Collections.Generic;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;
	using FastFood.DataAccess;
    using System.Data.Linq;
    using System.Linq;

	/// <summary>
	/// Represents the Manager of Ventas.
	/// </summary>
	[Serializable]
	public class VentasManager : Singleton<VentasManager>
	{
        #region Methods

        /// <summary>
        /// Selects all records from the Compras table.
        /// </summary>
        public IList<Ventas> ListarByEstado(string estado)
        {
            try
            {
                return VentasData.Instancia.ListarByEstado(estado.Substring(0, 1)).Reverse().ToList();
            }
            catch (Exception) { throw; }
        }

		/// <summary>
		/// Selects all records from the Ventas table.
		/// </summary>
		public IList<Ventas> Listar()
		{
			try
			{
                return VentasData.Instancia.Listar().Reverse().ToList();
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects a single record from the Ventas table.
		/// </summary>
		public Ventas Obtener(int ventaID)
		{
			try
			{
                Ventas venta = VentasData.Instancia.Obtener(ventaID);
                venta.Correlativos = CorrelativosData.Instancia.Obtener(venta.correlativoID);
                venta.DetallesVentasCombos = new EntitySet<DetallesVentasCombos>();
                venta.DetallesVentasProductos = new EntitySet<DetallesVentasProductos>();
                venta.DetallesVentasInsumos = new EntitySet<DetallesVentasInsumos>();
                venta.detalles = new List<DetalleVendibles>();
                venta.DetallesVentasCombos.AddRange(DetallesVentasCombosData.Instancia.ListarPorVentaID(ventaID));
                venta.DetallesVentasProductos.AddRange(DetallesVentasProductosData.Instancia.ListarPorVentaID(ventaID));
                venta.DetallesVentasInsumos.AddRange(DetallesVentasInsumosData.Instancia.ListarPorVentaID(ventaID));

                foreach (DetallesVentasCombos detalle in venta.DetallesVentasCombos)
                {
                    detalle.Combos = CombosData.Instancia.Obtener(detalle.comboID);
                    DetalleVendibles vendible = new DetalleVendibles();
                    vendible.ConvertFromDetalleCombos(detalle, venta.IGV, venta.servicios);
                    venta.detalles.Add(vendible);
                }
                foreach (DetallesVentasProductos detalle in venta.DetallesVentasProductos)
                {
                    detalle.Productos = ProductosData.Instancia.Obtener(detalle.productoID);
                    DetalleVendibles vendible = new DetalleVendibles();
                    vendible.ConvertFromDetalleProductos(detalle, venta.IGV, venta.servicios);
                    venta.detalles.Add(vendible);
                }
                foreach (DetallesVentasInsumos detalle in venta.DetallesVentasInsumos)
                {
                    detalle.Insumos = InsumosData.Instancia.Obtener(detalle.insumoID);
                    DetalleVendibles vendible = new DetalleVendibles();
                    vendible.ConvertFromDetalleInsumos(detalle, venta.IGV, venta.servicios);
                    venta.detalles.Add(vendible);
                }

                return venta;
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects all records from the Ventas table by a foreign key.
		/// </summary>
		public IList<Ventas> ListarPorClienteID(int clienteID)
		{
			try
			{
                //return VentasData.Instancia.ListarPorClienteID(clienteID).Reverse().ToList();
                return new List<Ventas>();
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects all records from the Ventas table by a foreign key.
		/// </summary>
		public IList<Ventas> ListarPorPersonalID(short personalID)
		{
			try
			{
                //return VentasData.Instancia.ListarPorPersonalID(personalID);
                return new List<Ventas>();
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects all records from the Ventas table by a foreign key.
		/// </summary>
		public IList<Ventas> ListarPorPersonalDevolucionID(short personalDevolucionID)
		{
			try
			{
                //return VentasData.Instancia.ListarPorPersonalDevolucionID(personalDevolucionID);
                return new List<Ventas>();
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Selects all records from the Ventas table by a foreign key.
		/// </summary>
		public IList<Ventas> ListarPorVentaExtornadaID(int ventaExtornadaID)
		{
			try
			{
                //return VentasData.Instancia.ListarPorVentaExtornadaID(ventaExtornadaID);
                return new List<Ventas>();
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Saves a record to the Ventas table.
		/// </summary>
		public int Agregar(Ventas ventas)
		{
			try
            {
                GenerarCorrelativo(ventas);
                ventas.estado = 'R';
                return VentasData.Instancia.Agregar(ventas);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Updates a record in the Ventas table.
		/// </summary>
		public bool Modificar(Ventas ventas)
		{
			try
            {
                List<DetallesVentasInterno> detallesInternos = new List<DetallesVentasInterno>(DetallesVentasInternoData.Instancia.ListarPorVentaID(ventas.ventaID));
                foreach (DetallesVentasInterno detInterno in detallesInternos)
                {
                    detInterno.Lotes = LotesData.Instancia.Obtener(detInterno.loteID);
                }
                Ventas ventaAntigua = this.Obtener(ventas.ventaID);
                GenerarCorrelativo(ventas);
                ventas.estado = 'E';
                return VentasData.Instancia.Modificar(ventas, ventaAntigua, detallesInternos);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Deletes a record from the Ventas table by its primary key.
		/// </summary>
		public bool Eliminar(Ventas venta)
		{
			try
			{
                List<DetallesVentasInterno> detallesInternos = new List<DetallesVentasInterno>(DetallesVentasInternoData.Instancia.ListarPorVentaID(venta.ventaID));
                foreach (DetallesVentasInterno detInterno in detallesInternos)
                {
                    detInterno.Lotes = LotesData.Instancia.Obtener(detInterno.loteID);
                }
				return VentasData.Instancia.Eliminar(venta, detallesInternos);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Deletes a record from the Ventas table by a foreign key.
		/// </summary>
		public void EliminarPorClienteID(int clienteID)
		{
			try
			{
				//VentasData.Instancia.EliminarPorClienteID(clienteID);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Deletes a record from the Ventas table by a foreign key.
		/// </summary>
		public void EliminarPorPersonalID(short personalID)
		{
			try
			{
				//VentasData.Instancia.EliminarPorPersonalID(personalID);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Deletes a record from the Ventas table by a foreign key.
		/// </summary>
		public void EliminarPorPersonalDevolucionID(short personalDevolucionID)
		{
			try
			{
				//VentasData.Instancia.EliminarPorPersonalDevolucionID(personalDevolucionID);
			}
			catch (Exception) { throw; }
		}

		/// <summary>
		/// Deletes a record from the Ventas table by a foreign key.
		/// </summary>
		public void EliminarPorVentaExtornadaID(int ventaExtornadaID)
		{
			try
			{
				//VentasData.Instancia.EliminarPorVentaExtornadaID(ventaExtornadaID);
			}
			catch (Exception) { throw; }
		}

        private void GenerarCorrelativo(Ventas ventas)
        {
            ventas.Correlativos = CorrelativosData.Instancia.ObtenerActivoByTipoDocumento(ventas.tipoDocumento);
            if (ventas.Correlativos.tipoDocumento != ventas.tipoDocumento) throw new Exception("Este tipo de documento no tiene series activas.");
            ventas.correlativoID = ventas.Correlativos.correlativoID;
            ventas.numero = ventas.Correlativos.numeroActual.ToString();
            ventas.Correlativos.numeroActual++;
        }

		#endregion
	}
}
